﻿#include"../../include/gfxcoder.h"
#include"../../include/fft/fft.h"

void gfxcoder::scgemm5x4_ck()
{
    uint2 c[4][4], a[2][4], b[2][4];
    for( int i=0; i<32; ++i ){ ((uint32_t*)&c[0][0].x)[i]=v0+i; }
    a[0][0].x=v32; a[0][0].y=v33;
    a[0][1].x=v34; a[0][1].y=v35;
    a[0][2].x=v36; a[0][2].y=v37;
    a[0][3].x=v38; a[0][3].y=v39;
    b[0][0].x=v40; b[0][0].y=v41;
    b[0][1].x=v42; b[0][1].y=v43;
    b[0][2].x=v44; b[0][2].y=v45;
    b[0][3].x=v46; b[0][3].y=v47;
    a[1][0].x=v48; a[1][0].y=v49;
    a[1][1].x=v50; a[1][1].y=v51;
    a[1][2].x=v52; a[1][2].y=v53;
    a[1][3].x=v54; a[1][3].y=v55;
    b[1][0].x=v56; b[1][0].y=v57;
    b[1][1].x=v58; b[1][1].y=v59;
    b[1][2].x=v60; b[1][2].y=v61;
    b[1][3].x=v62; b[1][3].y=v63;

    const uint32_t argptr =s0 ;
    const uint32_t gidx   =s2 ;
    const uint32_t gidy   =s3 ;
    const uint32_t gidz   =s15;
    const uint32_t abase  =s4 ;
    const uint32_t bbase  =s6 ;
    const uint32_t lda    =s8 ;
    const uint32_t ldb    =s9 ;
    const uint32_t m      =s10;
    const uint32_t n      =s11;
    const uint32_t k      =s12;
    const uint32_t abks   =s13;
    const uint32_t bbks   =s14;
    const uint32_t col    =s13;
    const uint32_t dbtr   =s8 ;
    const uint32_t elda   =s2 ;
    const uint32_t eldb   =s3 ;
    const uint32_t cbase  =s0 ;
    const uint32_t ldc    =s2 ;
    const uint32_t cbks   =s3 ;
    const uint32_t alpha  =s8 ;

    const uint32_t apld=v64 ;
    const uint32_t bpld=v80 ;
    const uint32_t ao  =v88 ;
    const uint32_t bo  =v92 ;
    const uint32_t sst =v94 ;
    const uint32_t asld=v95 ;
    const uint32_t bsld=v96 ;
    const uint32_t csst=v97 ;
    const uint32_t csld=v98 ;
    const uint32_t tidx=v99 ;
    const uint32_t bank=v100;

    metadata_start();
    {
        metadata_set_lds_size(0x3000);
        metadata_set_kernarg_align(5);
        metadata_set_kernarg_size(64);
        metadata_set_group_size(64);
        metadata_set_sgprcnt(23);
        metadata_set_vgprcnt(101);
    }
    metadata_end();

    kernel.start_descr();
    {
        kernel.enable_kernarg_segment();
        kernel.set_fp32_mode_round(amdgpu_fp_mode_rn);
        kernel.set_fp32_mode_denorm(amdgpu_fp_denorm_fsd);
        kernel.set_fp16_fp64_mode_round(amdgpu_fp_mode_rn);
        kernel.set_fp16_fp64_mode_denorm(amdgpu_fp_denorm_fn);
        kernel.enable_dx10_clamp();
        kernel.enable_ieee_mode();
        kernel.set_user_sgprcnt(2);
        kernel.enable_sgpr_group_id_x();
        kernel.enable_sgpr_group_id_y();
        kernel.enable_sgpr_group_id_z();
        kernel.enable_vgpr_iterm_id_1d();
    }
    kernel.end_descr();
    
    s_mov_b32(gidz,s4);
    s_lda_b256(s4,argptr,0x10);
    s_lda_b64(s12,argptr,0x30);
    s_lda_b32(s14,argptr,0x38);
    v_and_b32(v1,ic(31),v0);
    v_and_b32(v3,ic(15),v0);
    v_and_b32(v5,ic(7),v0);
    v_shr_b32(v2,v0,5);
    v_shr_b32(v4,v1,4);
    v_shr_b32(v6,v1,3);
    v_shl_or_b32(v7,gidx,4,v3);
    v_shl_or_b32(v8,gidy,3,v5);
    v_shl_or_b32(bank,gidz,1,v2);
    v_shl_or_b32(tidx,gidx,5,v1);
    s_sync(lgkmcnt(0));

    s_add_u32(s16,ic(1),m);
    s_add_u32(s17,ic(1),n);
    s_shl_b32(lda,lda,3);
    s_shl_b32(ldb,ldb,3);
    s_shl_b32(abks,abks,3);
    s_shl_b32(bbks,bbks,3);
    s_shl_b32(s18,lda,1);
    s_shr_b32(s16,s16,1);
    s_shr_b32(s17,s17,1);
    v_cmp_u32(s16,v7,gt);
    v_cmov_b32(v7,zero,v7);
    v_cmp_u32(s17,v8,gt);
    v_cmov_b32(v8,zero,v8);
    v_mul_lo_u32(v9 ,abks,bank);
    v_mul_lo_u32(v10,bbks,bank);
    v_mul_lo_u32(v11,lda,v4);
    v_mul_lo_u32(v12,ldb,v6);
    v_shl_add_u32(ao,v7,4,v9 );
    v_shl_add_u32(bo,v8,4,v10);
    v_add_u32(ao,ao,v11);
    v_add_u32(bo,bo,v12);
    v_add_u32(ao+1,s18,ao+0);
    v_add_u32(ao+2,s18,ao+1);
    v_add_u32(ao+3,s18,ao+2);
    v_shl_add_u32(bo+1,ldb,2,bo);
    ldg_b128(apld+0x0,abase,ao+0,0);
    ldg_b128(apld+0x4,abase,ao+1,0);
    ldg_b128(apld+0x8,abase,ao+2,0);
    ldg_b128(apld+0xc,abase,ao+3,0);
    ldg_b128(bpld+0x0,bbase,bo+0,0);
    ldg_b128(bpld+0x4,bbase,bo+1,0);

    v_shl_b32(sst,v0,4);
    v_shl_b32(v3,v5,4);
    v_shl_b32(v4,v2,9);
    v_shl_b32(csld,v0,3);
    s_shl_b32(col,gidy,4);
    v_shl_or_b32(v7,v6,9,v3);
    v_shl_or_b32(bsld,v6,4,v4);
    v_shl_or_b32(csst,v2,8,v7);
    v_or_b32(asld,v3,v4);

    VZERO32(c[0][0].x);
    if((kernel.icode&1)==0){ s_nop(); }
    s_sync(vmcnt(0));
    lsst_b128(sst,0x0000,apld+0x0);
    lsst_b128(sst,0x0400,apld+0x4);
    lsst_b128(sst,0x0800,apld+0x8);
    lsst_b128(sst,0x0c00,apld+0xc);
    lsst_b128(sst,0x1000,bpld+0x0);
    lsst_b128(sst,0x1400,bpld+0x4);
    s_shl_b32(elda,lda,3);
    s_shl_b32(eldb,ldb,3);
    s_movk_i32(dbtr,0x1800);
    s_sync(lgkmcnt(0));
    lsld_b128(a[0][0].x,asld,0x0000);
    lsld_b128(a[0][2].x,asld,0x0080);
    lsld_b128(b[0][0].x,bsld,0x1000);
    lsld_b128(b[0][2].x,bsld,0x1040);
    s_cmpk_u32(k,8,gt);
    s_cbra_scc0(1);
    S_ADD_U64_U32(abase,abase,elda);
    S_ADD_U64_U32(bbase,bbase,eldb);

__lable__(0);
    lsld_b128(a[1][0].x,asld,0x0100);
    lsld_b128(a[1][2].x,asld,0x0180);
    lsld_b128(b[1][0].x,bsld,0x1080);
    lsld_b128(b[1][2].x,bsld,0x10c0);
    v_xor_b32(sst,dbtr,sst);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[0][0].x,b[0][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[0][0].x,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].x,b[0][0].x);
    V_MAC_F32(c[0][1].y,a[0][1].x,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].x,b[0][0].x);
    V_MAC_F32(c[0][2].y,a[0][2].x,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].x,b[0][0].x);
    V_MAC_F32(c[0][3].y,a[0][3].x,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].x,b[0][1].x);
    V_MAC_F32(c[1][0].y,a[0][0].x,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].x,b[0][1].x);
    V_MAC_F32(c[1][1].y,a[0][1].x,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].x,b[0][1].x);
    V_MAC_F32(c[1][2].y,a[0][2].x,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].x,b[0][1].x);
    V_MAC_F32(c[1][3].y,a[0][3].x,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].x,b[0][2].x);
    V_MAC_F32(c[2][0].y,a[0][0].x,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].x,b[0][2].x);
    V_MAC_F32(c[2][1].y,a[0][1].x,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].x,b[0][2].x);
    V_MAC_F32(c[2][2].y,a[0][2].x,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].x,b[0][2].x);
    V_MAC_F32(c[2][3].y,a[0][3].x,b[0][2].y);
    ldg_b128(apld+0x0,abase,ao+0,0);
    ldg_b128(apld+0x4,abase,ao+1,0);
    ldg_b128(apld+0x8,abase,ao+2,0);
    ldg_b128(apld+0xc,abase,ao+3,0);
    ldg_b128(bpld+0x0,bbase,bo+0,0);
    ldg_b128(bpld+0x4,bbase,bo+1,0);
    V_MAC_F32(c[3][0].x,a[0][0].x,b[0][3].x);
    V_MAC_F32(c[3][0].y,a[0][0].x,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].x,b[0][3].x);
    V_MAC_F32(c[3][1].y,a[0][1].x,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].x,b[0][3].x);
    V_MAC_F32(c[3][2].y,a[0][2].x,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].x,b[0][3].x);
    V_MAC_F32(c[3][3].y,a[0][3].x,b[0][3].y);
    V_MAC_F32(c[0][0].x,a[0][0].y,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].y,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].y,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].y,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].y,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].y,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].y,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].y,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].y,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].y,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].y,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].y,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].y,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].y,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].y,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].y,b[0][3].y);
    V_MAC_F32(c[0][0].y,a[0][0].y,neg(b[0][0].x));
    V_MAC_F32(c[0][1].y,a[0][1].y,neg(b[0][0].x));
    V_MAC_F32(c[0][2].y,a[0][2].y,neg(b[0][0].x));
    V_MAC_F32(c[0][3].y,a[0][3].y,neg(b[0][0].x));
    V_MAC_F32(c[1][0].y,a[0][0].y,neg(b[0][1].x));
    V_MAC_F32(c[1][1].y,a[0][1].y,neg(b[0][1].x));
    V_MAC_F32(c[1][2].y,a[0][2].y,neg(b[0][1].x));
    V_MAC_F32(c[1][3].y,a[0][3].y,neg(b[0][1].x));
    V_MAC_F32(c[2][0].y,a[0][0].y,neg(b[0][2].x));
    V_MAC_F32(c[2][1].y,a[0][1].y,neg(b[0][2].x));
    V_MAC_F32(c[2][2].y,a[0][2].y,neg(b[0][2].x));
    V_MAC_F32(c[2][3].y,a[0][3].y,neg(b[0][2].x));
    V_MAC_F32(c[3][0].y,a[0][0].y,neg(b[0][3].x));
    V_MAC_F32(c[3][1].y,a[0][1].y,neg(b[0][3].x));
    V_MAC_F32(c[3][2].y,a[0][2].y,neg(b[0][3].x));
    V_MAC_F32(c[3][3].y,a[0][3].y,neg(b[0][3].x));
    s_setprio(0);

    lsld_b128(a[0][0].x,asld,0x0400);
    lsld_b128(a[0][2].x,asld,0x0480);
    lsld_b128(b[0][0].x,bsld,0x1100);
    lsld_b128(b[0][2].x,bsld,0x1140);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[1][0].x,b[1][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[1][0].x,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].x,b[1][0].x);
    V_MAC_F32(c[0][1].y,a[1][1].x,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].x,b[1][0].x);
    V_MAC_F32(c[0][2].y,a[1][2].x,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].x,b[1][0].x);
    V_MAC_F32(c[0][3].y,a[1][3].x,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].x,b[1][1].x);
    V_MAC_F32(c[1][0].y,a[1][0].x,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].x,b[1][1].x);
    V_MAC_F32(c[1][1].y,a[1][1].x,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].x,b[1][1].x);
    V_MAC_F32(c[1][2].y,a[1][2].x,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].x,b[1][1].x);
    V_MAC_F32(c[1][3].y,a[1][3].x,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].x,b[1][2].x);
    V_MAC_F32(c[2][0].y,a[1][0].x,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].x,b[1][2].x);
    V_MAC_F32(c[2][1].y,a[1][1].x,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].x,b[1][2].x);
    V_MAC_F32(c[2][2].y,a[1][2].x,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].x,b[1][2].x);
    V_MAC_F32(c[2][3].y,a[1][3].x,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].x,b[1][3].x);
    V_MAC_F32(c[3][0].y,a[1][0].x,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].x,b[1][3].x);
    V_MAC_F32(c[3][1].y,a[1][1].x,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].x,b[1][3].x);
    V_MAC_F32(c[3][2].y,a[1][2].x,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].x,b[1][3].x);
    V_MAC_F32(c[3][3].y,a[1][3].x,b[1][3].y);
    V_MAC_F32(c[0][0].x,a[1][0].y,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].y,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].y,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].y,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].y,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].y,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].y,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].y,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].y,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].y,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].y,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].y,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].y,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].y,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].y,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].y,b[1][3].y);
    V_MAC_F32(c[0][0].y,a[1][0].y,neg(b[1][0].x));
    V_MAC_F32(c[0][1].y,a[1][1].y,neg(b[1][0].x));
    V_MAC_F32(c[0][2].y,a[1][2].y,neg(b[1][0].x));
    V_MAC_F32(c[0][3].y,a[1][3].y,neg(b[1][0].x));
    V_MAC_F32(c[1][0].y,a[1][0].y,neg(b[1][1].x));
    V_MAC_F32(c[1][1].y,a[1][1].y,neg(b[1][1].x));
    V_MAC_F32(c[1][2].y,a[1][2].y,neg(b[1][1].x));
    V_MAC_F32(c[1][3].y,a[1][3].y,neg(b[1][1].x));
    V_MAC_F32(c[2][0].y,a[1][0].y,neg(b[1][2].x));
    V_MAC_F32(c[2][1].y,a[1][1].y,neg(b[1][2].x));
    V_MAC_F32(c[2][2].y,a[1][2].y,neg(b[1][2].x));
    V_MAC_F32(c[2][3].y,a[1][3].y,neg(b[1][2].x));
    V_MAC_F32(c[3][0].y,a[1][0].y,neg(b[1][3].x));
    V_MAC_F32(c[3][1].y,a[1][1].y,neg(b[1][3].x));
    V_MAC_F32(c[3][2].y,a[1][2].y,neg(b[1][3].x));
    V_MAC_F32(c[3][3].y,a[1][3].y,neg(b[1][3].x));
    s_setprio(0);
    s_add_u32(abase,abase,elda);

    lsld_b128(a[1][0].x,asld,0x0500);
    lsld_b128(a[1][2].x,asld,0x0580);
    lsld_b128(b[1][0].x,bsld,0x1180);
    lsld_b128(b[1][2].x,bsld,0x11c0);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[0][0].x,b[0][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[0][0].x,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].x,b[0][0].x);
    V_MAC_F32(c[0][1].y,a[0][1].x,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].x,b[0][0].x);
    V_MAC_F32(c[0][2].y,a[0][2].x,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].x,b[0][0].x);
    V_MAC_F32(c[0][3].y,a[0][3].x,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].x,b[0][1].x);
    V_MAC_F32(c[1][0].y,a[0][0].x,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].x,b[0][1].x);
    V_MAC_F32(c[1][1].y,a[0][1].x,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].x,b[0][1].x);
    V_MAC_F32(c[1][2].y,a[0][2].x,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].x,b[0][1].x);
    V_MAC_F32(c[1][3].y,a[0][3].x,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].x,b[0][2].x);
    V_MAC_F32(c[2][0].y,a[0][0].x,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].x,b[0][2].x);
    V_MAC_F32(c[2][1].y,a[0][1].x,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].x,b[0][2].x);
    V_MAC_F32(c[2][2].y,a[0][2].x,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].x,b[0][2].x);
    V_MAC_F32(c[2][3].y,a[0][3].x,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].x,b[0][3].x);
    V_MAC_F32(c[3][0].y,a[0][0].x,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].x,b[0][3].x);
    V_MAC_F32(c[3][1].y,a[0][1].x,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].x,b[0][3].x);
    V_MAC_F32(c[3][2].y,a[0][2].x,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].x,b[0][3].x);
    V_MAC_F32(c[3][3].y,a[0][3].x,b[0][3].y);
    V_MAC_F32(c[0][0].x,a[0][0].y,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].y,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].y,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].y,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].y,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].y,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].y,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].y,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].y,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].y,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].y,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].y,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].y,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].y,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].y,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].y,b[0][3].y);
    V_MAC_F32(c[0][0].y,a[0][0].y,neg(b[0][0].x));
    V_MAC_F32(c[0][1].y,a[0][1].y,neg(b[0][0].x));
    V_MAC_F32(c[0][2].y,a[0][2].y,neg(b[0][0].x));
    V_MAC_F32(c[0][3].y,a[0][3].y,neg(b[0][0].x));
    V_MAC_F32(c[1][0].y,a[0][0].y,neg(b[0][1].x));
    V_MAC_F32(c[1][1].y,a[0][1].y,neg(b[0][1].x));
    V_MAC_F32(c[1][2].y,a[0][2].y,neg(b[0][1].x));
    V_MAC_F32(c[1][3].y,a[0][3].y,neg(b[0][1].x));
    V_MAC_F32(c[2][0].y,a[0][0].y,neg(b[0][2].x));
    V_MAC_F32(c[2][1].y,a[0][1].y,neg(b[0][2].x));
    V_MAC_F32(c[2][2].y,a[0][2].y,neg(b[0][2].x));
    V_MAC_F32(c[2][3].y,a[0][3].y,neg(b[0][2].x));
    V_MAC_F32(c[3][0].y,a[0][0].y,neg(b[0][3].x));
    V_MAC_F32(c[3][1].y,a[0][1].y,neg(b[0][3].x));
    V_MAC_F32(c[3][2].y,a[0][2].y,neg(b[0][3].x));
    V_MAC_F32(c[3][3].y,a[0][3].y,neg(b[0][3].x));
    s_setprio(0);
    s_addc_u32(abase+1,abase+1,zero);

    lsld_b128(a[0][0].x,asld,0x0800);
    lsld_b128(a[0][2].x,asld,0x0880);
    lsld_b128(b[0][0].x,bsld,0x1400);
    lsld_b128(b[0][2].x,bsld,0x1440);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[1][0].x,b[1][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[1][0].x,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].x,b[1][0].x);
    V_MAC_F32(c[0][1].y,a[1][1].x,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].x,b[1][0].x);
    V_MAC_F32(c[0][2].y,a[1][2].x,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].x,b[1][0].x);
    V_MAC_F32(c[0][3].y,a[1][3].x,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].x,b[1][1].x);
    V_MAC_F32(c[1][0].y,a[1][0].x,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].x,b[1][1].x);
    V_MAC_F32(c[1][1].y,a[1][1].x,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].x,b[1][1].x);
    V_MAC_F32(c[1][2].y,a[1][2].x,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].x,b[1][1].x);
    V_MAC_F32(c[1][3].y,a[1][3].x,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].x,b[1][2].x);
    V_MAC_F32(c[2][0].y,a[1][0].x,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].x,b[1][2].x);
    V_MAC_F32(c[2][1].y,a[1][1].x,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].x,b[1][2].x);
    V_MAC_F32(c[2][2].y,a[1][2].x,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].x,b[1][2].x);
    V_MAC_F32(c[2][3].y,a[1][3].x,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].x,b[1][3].x);
    V_MAC_F32(c[3][0].y,a[1][0].x,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].x,b[1][3].x);
    V_MAC_F32(c[3][1].y,a[1][1].x,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].x,b[1][3].x);
    V_MAC_F32(c[3][2].y,a[1][2].x,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].x,b[1][3].x);
    V_MAC_F32(c[3][3].y,a[1][3].x,b[1][3].y);
    V_MAC_F32(c[0][0].x,a[1][0].y,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].y,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].y,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].y,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].y,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].y,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].y,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].y,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].y,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].y,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].y,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].y,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].y,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].y,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].y,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].y,b[1][3].y);
    V_MAC_F32(c[0][0].y,a[1][0].y,neg(b[1][0].x));
    V_MAC_F32(c[0][1].y,a[1][1].y,neg(b[1][0].x));
    V_MAC_F32(c[0][2].y,a[1][2].y,neg(b[1][0].x));
    V_MAC_F32(c[0][3].y,a[1][3].y,neg(b[1][0].x));
    V_MAC_F32(c[1][0].y,a[1][0].y,neg(b[1][1].x));
    V_MAC_F32(c[1][1].y,a[1][1].y,neg(b[1][1].x));
    V_MAC_F32(c[1][2].y,a[1][2].y,neg(b[1][1].x));
    V_MAC_F32(c[1][3].y,a[1][3].y,neg(b[1][1].x));
    V_MAC_F32(c[2][0].y,a[1][0].y,neg(b[1][2].x));
    V_MAC_F32(c[2][1].y,a[1][1].y,neg(b[1][2].x));
    V_MAC_F32(c[2][2].y,a[1][2].y,neg(b[1][2].x));
    V_MAC_F32(c[2][3].y,a[1][3].y,neg(b[1][2].x));
    V_MAC_F32(c[3][0].y,a[1][0].y,neg(b[1][3].x));
    V_MAC_F32(c[3][1].y,a[1][1].y,neg(b[1][3].x));
    V_MAC_F32(c[3][2].y,a[1][2].y,neg(b[1][3].x));
    V_MAC_F32(c[3][3].y,a[1][3].y,neg(b[1][3].x));
    s_setprio(0);
    s_add_u32(bbase,bbase,eldb);

    lsld_b128(a[1][0].x,asld,0x0900);
    lsld_b128(a[1][2].x,asld,0x0980);
    lsld_b128(b[1][0].x,bsld,0x1480);
    lsld_b128(b[1][2].x,bsld,0x14c0);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[0][0].x,b[0][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[0][0].x,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].x,b[0][0].x);
    V_MAC_F32(c[0][1].y,a[0][1].x,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].x,b[0][0].x);
    V_MAC_F32(c[0][2].y,a[0][2].x,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].x,b[0][0].x);
    V_MAC_F32(c[0][3].y,a[0][3].x,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].x,b[0][1].x);
    V_MAC_F32(c[1][0].y,a[0][0].x,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].x,b[0][1].x);
    V_MAC_F32(c[1][1].y,a[0][1].x,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].x,b[0][1].x);
    V_MAC_F32(c[1][2].y,a[0][2].x,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].x,b[0][1].x);
    V_MAC_F32(c[1][3].y,a[0][3].x,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].x,b[0][2].x);
    V_MAC_F32(c[2][0].y,a[0][0].x,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].x,b[0][2].x);
    V_MAC_F32(c[2][1].y,a[0][1].x,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].x,b[0][2].x);
    V_MAC_F32(c[2][2].y,a[0][2].x,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].x,b[0][2].x);
    V_MAC_F32(c[2][3].y,a[0][3].x,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].x,b[0][3].x);
    V_MAC_F32(c[3][0].y,a[0][0].x,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].x,b[0][3].x);
    V_MAC_F32(c[3][1].y,a[0][1].x,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].x,b[0][3].x);
    V_MAC_F32(c[3][2].y,a[0][2].x,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].x,b[0][3].x);
    V_MAC_F32(c[3][3].y,a[0][3].x,b[0][3].y);
    V_MAC_F32(c[0][0].x,a[0][0].y,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].y,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].y,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].y,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].y,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].y,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].y,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].y,b[0][1].y);
    V_MAC_F32(c[2][0].x,a[0][0].y,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].y,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].y,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].y,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].y,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].y,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].y,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].y,b[0][3].y);
    V_MAC_F32(c[0][0].y,a[0][0].y,neg(b[0][0].x));
    V_MAC_F32(c[0][1].y,a[0][1].y,neg(b[0][0].x));
    V_MAC_F32(c[0][2].y,a[0][2].y,neg(b[0][0].x));
    V_MAC_F32(c[0][3].y,a[0][3].y,neg(b[0][0].x));
    V_MAC_F32(c[1][0].y,a[0][0].y,neg(b[0][1].x));
    V_MAC_F32(c[1][1].y,a[0][1].y,neg(b[0][1].x));
    V_MAC_F32(c[1][2].y,a[0][2].y,neg(b[0][1].x));
    V_MAC_F32(c[1][3].y,a[0][3].y,neg(b[0][1].x));
    V_MAC_F32(c[2][0].y,a[0][0].y,neg(b[0][2].x));
    V_MAC_F32(c[2][1].y,a[0][1].y,neg(b[0][2].x));
    V_MAC_F32(c[2][2].y,a[0][2].y,neg(b[0][2].x));
    V_MAC_F32(c[2][3].y,a[0][3].y,neg(b[0][2].x));
    V_MAC_F32(c[3][0].y,a[0][0].y,neg(b[0][3].x));
    V_MAC_F32(c[3][1].y,a[0][1].y,neg(b[0][3].x));
    V_MAC_F32(c[3][2].y,a[0][2].y,neg(b[0][3].x));
    V_MAC_F32(c[3][3].y,a[0][3].y,neg(b[0][3].x));
    s_setprio(0);
    s_addc_u32(bbase+1,bbase+1,zero);

    lsld_b128(a[0][0].x,asld,0x0c00);
    lsld_b128(a[0][2].x,asld,0x0c80);
    lsld_b128(b[0][0].x,bsld,0x1500);
    lsld_b128(b[0][2].x,bsld,0x1540);
    s_sync(lgkmcnt(4));
    V_MAC_F32(c[0][0].x,a[1][0].x,b[1][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[1][0].x,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].x,b[1][0].x);
    V_MAC_F32(c[0][1].y,a[1][1].x,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].x,b[1][0].x);
    V_MAC_F32(c[0][2].y,a[1][2].x,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].x,b[1][0].x);
    V_MAC_F32(c[0][3].y,a[1][3].x,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].x,b[1][1].x);
    V_MAC_F32(c[1][0].y,a[1][0].x,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].x,b[1][1].x);
    V_MAC_F32(c[1][1].y,a[1][1].x,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].x,b[1][1].x);
    V_MAC_F32(c[1][2].y,a[1][2].x,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].x,b[1][1].x);
    V_MAC_F32(c[1][3].y,a[1][3].x,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].x,b[1][2].x);
    V_MAC_F32(c[2][0].y,a[1][0].x,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].x,b[1][2].x);
    V_MAC_F32(c[2][1].y,a[1][1].x,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].x,b[1][2].x);
    V_MAC_F32(c[2][2].y,a[1][2].x,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].x,b[1][2].x);
    V_MAC_F32(c[2][3].y,a[1][3].x,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].x,b[1][3].x);
    V_MAC_F32(c[3][0].y,a[1][0].x,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].x,b[1][3].x);
    V_MAC_F32(c[3][1].y,a[1][1].x,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].x,b[1][3].x);
    V_MAC_F32(c[3][2].y,a[1][2].x,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].x,b[1][3].x);
    V_MAC_F32(c[3][3].y,a[1][3].x,b[1][3].y);
    V_MAC_F32(c[0][0].x,a[1][0].y,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].y,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].y,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].y,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].y,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].y,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].y,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].y,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].y,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].y,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].y,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].y,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].y,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].y,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].y,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].y,b[1][3].y);
    V_MAC_F32(c[0][0].y,a[1][0].y,neg(b[1][0].x));
    V_MAC_F32(c[0][1].y,a[1][1].y,neg(b[1][0].x));
    V_MAC_F32(c[0][2].y,a[1][2].y,neg(b[1][0].x));
    V_MAC_F32(c[0][3].y,a[1][3].y,neg(b[1][0].x));
    V_MAC_F32(c[1][0].y,a[1][0].y,neg(b[1][1].x));
    V_MAC_F32(c[1][1].y,a[1][1].y,neg(b[1][1].x));
    V_MAC_F32(c[1][2].y,a[1][2].y,neg(b[1][1].x));
    V_MAC_F32(c[1][3].y,a[1][3].y,neg(b[1][1].x));
    V_MAC_F32(c[2][0].y,a[1][0].y,neg(b[1][2].x));
    V_MAC_F32(c[2][1].y,a[1][1].y,neg(b[1][2].x));
    V_MAC_F32(c[2][2].y,a[1][2].y,neg(b[1][2].x));
    V_MAC_F32(c[2][3].y,a[1][3].y,neg(b[1][2].x));
    V_MAC_F32(c[3][0].y,a[1][0].y,neg(b[1][3].x));
    V_MAC_F32(c[3][1].y,a[1][1].y,neg(b[1][3].x));
    V_MAC_F32(c[3][2].y,a[1][2].y,neg(b[1][3].x));
    V_MAC_F32(c[3][3].y,a[1][3].y,neg(b[1][3].x));
    s_setprio(0);
    s_sub_u32(k,k,ic(8));

    lsld_b128(a[1][0].x,asld,0x0d00);
    lsld_b128(a[1][2].x,asld,0x0d80);
    lsld_b128(b[1][0].x,bsld,0x1580);
    lsld_b128(b[1][2].x,bsld,0x15c0);
    s_sync(lgkmcnt(5));
    V_MAC_F32(c[0][0].x,a[0][0].x,b[0][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[0][0].x,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].x,b[0][0].x);
    V_MAC_F32(c[0][1].y,a[0][1].x,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].x,b[0][0].x);
    V_MAC_F32(c[0][2].y,a[0][2].x,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].x,b[0][0].x);
    V_MAC_F32(c[0][3].y,a[0][3].x,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].x,b[0][1].x);
    V_MAC_F32(c[1][0].y,a[0][0].x,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].x,b[0][1].x);
    V_MAC_F32(c[1][1].y,a[0][1].x,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].x,b[0][1].x);
    V_MAC_F32(c[1][2].y,a[0][2].x,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].x,b[0][1].x);
    V_MAC_F32(c[1][3].y,a[0][3].x,b[0][1].y);
    V_MAC_F32(c[0][0].x,a[0][0].y,b[0][0].y);
    V_MAC_F32(c[0][1].x,a[0][1].y,b[0][0].y);
    V_MAC_F32(c[0][2].x,a[0][2].y,b[0][0].y);
    V_MAC_F32(c[0][3].x,a[0][3].y,b[0][0].y);
    V_MAC_F32(c[1][0].x,a[0][0].y,b[0][1].y);
    V_MAC_F32(c[1][1].x,a[0][1].y,b[0][1].y);
    V_MAC_F32(c[1][2].x,a[0][2].y,b[0][1].y);
    V_MAC_F32(c[1][3].x,a[0][3].y,b[0][1].y);
    V_MAC_F32(c[0][0].y,a[0][0].y,neg(b[0][0].x));
    V_MAC_F32(c[0][1].y,a[0][1].y,neg(b[0][0].x));
    V_MAC_F32(c[0][2].y,a[0][2].y,neg(b[0][0].x));
    V_MAC_F32(c[0][3].y,a[0][3].y,neg(b[0][0].x));
    V_MAC_F32(c[1][0].y,a[0][0].y,neg(b[0][1].x));
    V_MAC_F32(c[1][1].y,a[0][1].y,neg(b[0][1].x));
    V_MAC_F32(c[1][2].y,a[0][2].y,neg(b[0][1].x));
    V_MAC_F32(c[1][3].y,a[0][3].y,neg(b[0][1].x));
    s_setprio(0);
    v_xor_b32(asld,dbtr,asld);
    v_xor_b32(bsld,dbtr,bsld);
    s_sync(vmcnt(0)&lgkmcnt(4));
    lsst_b128(sst,0x0000,apld+0x0);
    lsst_b128(sst,0x0400,apld+0x4);
    lsst_b128(sst,0x0800,apld+0x8);
    lsst_b128(sst,0x0c00,apld+0xc);
    lsst_b128(sst,0x1000,bpld+0x0);
    lsst_b128(sst,0x1400,bpld+0x4);
    V_MAC_F32(c[2][0].x,a[0][0].x,b[0][2].x);
    s_setprio(1);
    V_MAC_F32(c[2][0].y,a[0][0].x,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].x,b[0][2].x);
    V_MAC_F32(c[2][1].y,a[0][1].x,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].x,b[0][2].x);
    V_MAC_F32(c[2][2].y,a[0][2].x,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].x,b[0][2].x);
    V_MAC_F32(c[2][3].y,a[0][3].x,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].x,b[0][3].x);
    V_MAC_F32(c[3][0].y,a[0][0].x,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].x,b[0][3].x);
    V_MAC_F32(c[3][1].y,a[0][1].x,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].x,b[0][3].x);
    V_MAC_F32(c[3][2].y,a[0][2].x,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].x,b[0][3].x);
    V_MAC_F32(c[3][3].y,a[0][3].x,b[0][3].y);
    V_MAC_F32(c[2][0].x,a[0][0].y,b[0][2].y);
    V_MAC_F32(c[2][1].x,a[0][1].y,b[0][2].y);
    V_MAC_F32(c[2][2].x,a[0][2].y,b[0][2].y);
    V_MAC_F32(c[2][3].x,a[0][3].y,b[0][2].y);
    V_MAC_F32(c[3][0].x,a[0][0].y,b[0][3].y);
    V_MAC_F32(c[3][1].x,a[0][1].y,b[0][3].y);
    V_MAC_F32(c[3][2].x,a[0][2].y,b[0][3].y);
    V_MAC_F32(c[3][3].x,a[0][3].y,b[0][3].y);
    V_MAC_F32(c[2][0].y,a[0][0].y,neg(b[0][2].x));
    V_MAC_F32(c[2][1].y,a[0][1].y,neg(b[0][2].x));
    V_MAC_F32(c[2][2].y,a[0][2].y,neg(b[0][2].x));
    V_MAC_F32(c[2][3].y,a[0][3].y,neg(b[0][2].x));
    V_MAC_F32(c[3][0].y,a[0][0].y,neg(b[0][3].x));
    V_MAC_F32(c[3][1].y,a[0][1].y,neg(b[0][3].x));
    V_MAC_F32(c[3][2].y,a[0][2].y,neg(b[0][3].x));
    V_MAC_F32(c[3][3].y,a[0][3].y,neg(b[0][3].x));
    s_setprio(0);
    s_cmpk_u32(k,8,le);
    s_sync(lgkmcnt(0));

    lsld_b128(a[0][0].x,asld,0x0000);
    lsld_b128(a[0][2].x,asld,0x0080);
    lsld_b128(b[0][0].x,bsld,0x1000);
    lsld_b128(b[0][2].x,bsld,0x1040);
    V_MAC_F32(c[0][0].x,a[1][0].x,b[1][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[1][0].x,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].x,b[1][0].x);
    V_MAC_F32(c[0][1].y,a[1][1].x,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].x,b[1][0].x);
    V_MAC_F32(c[0][2].y,a[1][2].x,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].x,b[1][0].x);
    V_MAC_F32(c[0][3].y,a[1][3].x,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].x,b[1][1].x);
    V_MAC_F32(c[1][0].y,a[1][0].x,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].x,b[1][1].x);
    V_MAC_F32(c[1][1].y,a[1][1].x,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].x,b[1][1].x);
    V_MAC_F32(c[1][2].y,a[1][2].x,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].x,b[1][1].x);
    V_MAC_F32(c[1][3].y,a[1][3].x,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].x,b[1][2].x);
    V_MAC_F32(c[2][0].y,a[1][0].x,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].x,b[1][2].x);
    V_MAC_F32(c[2][1].y,a[1][1].x,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].x,b[1][2].x);
    V_MAC_F32(c[2][2].y,a[1][2].x,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].x,b[1][2].x);
    V_MAC_F32(c[2][3].y,a[1][3].x,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].x,b[1][3].x);
    V_MAC_F32(c[3][0].y,a[1][0].x,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].x,b[1][3].x);
    V_MAC_F32(c[3][1].y,a[1][1].x,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].x,b[1][3].x);
    V_MAC_F32(c[3][2].y,a[1][2].x,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].x,b[1][3].x);
    V_MAC_F32(c[3][3].y,a[1][3].x,b[1][3].y);
    V_MAC_F32(c[0][0].x,a[1][0].y,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].y,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].y,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].y,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].y,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].y,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].y,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].y,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].y,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].y,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].y,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].y,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].y,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].y,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].y,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].y,b[1][3].y);
    V_MAC_F32(c[0][0].y,a[1][0].y,neg(b[1][0].x));
    V_MAC_F32(c[0][1].y,a[1][1].y,neg(b[1][0].x));
    V_MAC_F32(c[0][2].y,a[1][2].y,neg(b[1][0].x));
    V_MAC_F32(c[0][3].y,a[1][3].y,neg(b[1][0].x));
    V_MAC_F32(c[1][0].y,a[1][0].y,neg(b[1][1].x));
    V_MAC_F32(c[1][1].y,a[1][1].y,neg(b[1][1].x));
    V_MAC_F32(c[1][2].y,a[1][2].y,neg(b[1][1].x));
    V_MAC_F32(c[1][3].y,a[1][3].y,neg(b[1][1].x));
    V_MAC_F32(c[2][0].y,a[1][0].y,neg(b[1][2].x));
    V_MAC_F32(c[2][1].y,a[1][1].y,neg(b[1][2].x));
    V_MAC_F32(c[2][2].y,a[1][2].y,neg(b[1][2].x));
    V_MAC_F32(c[2][3].y,a[1][3].y,neg(b[1][2].x));
    V_MAC_F32(c[3][0].y,a[1][0].y,neg(b[1][3].x));
    V_MAC_F32(c[3][1].y,a[1][1].y,neg(b[1][3].x));
    V_MAC_F32(c[3][2].y,a[1][2].y,neg(b[1][3].x));
    V_MAC_F32(c[3][3].y,a[1][3].y,neg(b[1][3].x));
    s_setprio(0);
    s_cbra_scc0(0);

__lable__(1);
    for( int i=0; i<7; ++i ){
        int s=i&1;
        lsld_b128(a[1^s][0].x,asld,(i+1)*0x100+0x0000);
        lsld_b128(a[1^s][2].x,asld,(i+1)*0x100+0x0080);
        lsld_b128(b[1^s][0].x,bsld,(i+1)*0x080+0x1000);
        lsld_b128(b[1^s][2].x,bsld,(i+1)*0x080+0x1040);
        s_sync(lgkmcnt(4));
        V_MAC_F32(c[0][0].x,a[s][0].x,b[s][0].x);
        s_setprio(1);
        V_MAC_F32(c[0][0].y,a[s][0].x,b[s][0].y);
        V_MAC_F32(c[0][1].x,a[s][1].x,b[s][0].x);
        V_MAC_F32(c[0][1].y,a[s][1].x,b[s][0].y);
        V_MAC_F32(c[0][2].x,a[s][2].x,b[s][0].x);
        V_MAC_F32(c[0][2].y,a[s][2].x,b[s][0].y);
        V_MAC_F32(c[0][3].x,a[s][3].x,b[s][0].x);
        V_MAC_F32(c[0][3].y,a[s][3].x,b[s][0].y);
        V_MAC_F32(c[1][0].x,a[s][0].x,b[s][1].x);
        V_MAC_F32(c[1][0].y,a[s][0].x,b[s][1].y);
        V_MAC_F32(c[1][1].x,a[s][1].x,b[s][1].x);
        V_MAC_F32(c[1][1].y,a[s][1].x,b[s][1].y);
        V_MAC_F32(c[1][2].x,a[s][2].x,b[s][1].x);
        V_MAC_F32(c[1][2].y,a[s][2].x,b[s][1].y);
        V_MAC_F32(c[1][3].x,a[s][3].x,b[s][1].x);
        V_MAC_F32(c[1][3].y,a[s][3].x,b[s][1].y);
        V_MAC_F32(c[2][0].x,a[s][0].x,b[s][2].x);
        V_MAC_F32(c[2][0].y,a[s][0].x,b[s][2].y);
        V_MAC_F32(c[2][1].x,a[s][1].x,b[s][2].x);
        V_MAC_F32(c[2][1].y,a[s][1].x,b[s][2].y);
        V_MAC_F32(c[2][2].x,a[s][2].x,b[s][2].x);
        V_MAC_F32(c[2][2].y,a[s][2].x,b[s][2].y);
        V_MAC_F32(c[2][3].x,a[s][3].x,b[s][2].x);
        V_MAC_F32(c[2][3].y,a[s][3].x,b[s][2].y);
        V_MAC_F32(c[3][0].x,a[s][0].x,b[s][3].x);
        V_MAC_F32(c[3][0].y,a[s][0].x,b[s][3].y);
        V_MAC_F32(c[3][1].x,a[s][1].x,b[s][3].x);
        V_MAC_F32(c[3][1].y,a[s][1].x,b[s][3].y);
        V_MAC_F32(c[3][2].x,a[s][2].x,b[s][3].x);
        V_MAC_F32(c[3][2].y,a[s][2].x,b[s][3].y);
        V_MAC_F32(c[3][3].x,a[s][3].x,b[s][3].x);
        V_MAC_F32(c[3][3].y,a[s][3].x,b[s][3].y);
        V_MAC_F32(c[0][0].x,a[s][0].y,b[s][0].y);
        V_MAC_F32(c[0][1].x,a[s][1].y,b[s][0].y);
        V_MAC_F32(c[0][2].x,a[s][2].y,b[s][0].y);
        V_MAC_F32(c[0][3].x,a[s][3].y,b[s][0].y);
        V_MAC_F32(c[1][0].x,a[s][0].y,b[s][1].y);
        V_MAC_F32(c[1][1].x,a[s][1].y,b[s][1].y);
        V_MAC_F32(c[1][2].x,a[s][2].y,b[s][1].y);
        V_MAC_F32(c[1][3].x,a[s][3].y,b[s][1].y);
        V_MAC_F32(c[2][0].x,a[s][0].y,b[s][2].y);
        V_MAC_F32(c[2][1].x,a[s][1].y,b[s][2].y);
        V_MAC_F32(c[2][2].x,a[s][2].y,b[s][2].y);
        V_MAC_F32(c[2][3].x,a[s][3].y,b[s][2].y);
        V_MAC_F32(c[3][0].x,a[s][0].y,b[s][3].y);
        V_MAC_F32(c[3][1].x,a[s][1].y,b[s][3].y);
        V_MAC_F32(c[3][2].x,a[s][2].y,b[s][3].y);
        V_MAC_F32(c[3][3].x,a[s][3].y,b[s][3].y);
        V_MAC_F32(c[0][0].y,a[s][0].y,neg(b[s][0].x));
        V_MAC_F32(c[0][1].y,a[s][1].y,neg(b[s][0].x));
        V_MAC_F32(c[0][2].y,a[s][2].y,neg(b[s][0].x));
        V_MAC_F32(c[0][3].y,a[s][3].y,neg(b[s][0].x));
        V_MAC_F32(c[1][0].y,a[s][0].y,neg(b[s][1].x));
        V_MAC_F32(c[1][1].y,a[s][1].y,neg(b[s][1].x));
        V_MAC_F32(c[1][2].y,a[s][2].y,neg(b[s][1].x));
        V_MAC_F32(c[1][3].y,a[s][3].y,neg(b[s][1].x));
        V_MAC_F32(c[2][0].y,a[s][0].y,neg(b[s][2].x));
        V_MAC_F32(c[2][1].y,a[s][1].y,neg(b[s][2].x));
        V_MAC_F32(c[2][2].y,a[s][2].y,neg(b[s][2].x));
        V_MAC_F32(c[2][3].y,a[s][3].y,neg(b[s][2].x));
        V_MAC_F32(c[3][0].y,a[s][0].y,neg(b[s][3].x));
        V_MAC_F32(c[3][1].y,a[s][1].y,neg(b[s][3].x));
        V_MAC_F32(c[3][2].y,a[s][2].y,neg(b[s][3].x));
        V_MAC_F32(c[3][3].y,a[s][3].y,neg(b[s][3].x));
        s_setprio(0);
        s_cmpk_u32(k,1,gt);
        s_cbra_scc0(2);
    }
    s_sync(lgkmcnt(0));
    V_MAC_F32(c[0][0].x,a[1][0].x,b[1][0].x);
    s_setprio(1);
    V_MAC_F32(c[0][0].y,a[1][0].x,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].x,b[1][0].x);
    V_MAC_F32(c[0][1].y,a[1][1].x,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].x,b[1][0].x);
    V_MAC_F32(c[0][2].y,a[1][2].x,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].x,b[1][0].x);
    V_MAC_F32(c[0][3].y,a[1][3].x,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].x,b[1][1].x);
    V_MAC_F32(c[1][0].y,a[1][0].x,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].x,b[1][1].x);
    V_MAC_F32(c[1][1].y,a[1][1].x,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].x,b[1][1].x);
    V_MAC_F32(c[1][2].y,a[1][2].x,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].x,b[1][1].x);
    V_MAC_F32(c[1][3].y,a[1][3].x,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].x,b[1][2].x);
    V_MAC_F32(c[2][0].y,a[1][0].x,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].x,b[1][2].x);
    V_MAC_F32(c[2][1].y,a[1][1].x,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].x,b[1][2].x);
    V_MAC_F32(c[2][2].y,a[1][2].x,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].x,b[1][2].x);
    V_MAC_F32(c[2][3].y,a[1][3].x,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].x,b[1][3].x);
    V_MAC_F32(c[3][0].y,a[1][0].x,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].x,b[1][3].x);
    V_MAC_F32(c[3][1].y,a[1][1].x,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].x,b[1][3].x);
    V_MAC_F32(c[3][2].y,a[1][2].x,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].x,b[1][3].x);
    V_MAC_F32(c[3][3].y,a[1][3].x,b[1][3].y);
    V_MAC_F32(c[0][0].x,a[1][0].y,b[1][0].y);
    V_MAC_F32(c[0][1].x,a[1][1].y,b[1][0].y);
    V_MAC_F32(c[0][2].x,a[1][2].y,b[1][0].y);
    V_MAC_F32(c[0][3].x,a[1][3].y,b[1][0].y);
    V_MAC_F32(c[1][0].x,a[1][0].y,b[1][1].y);
    V_MAC_F32(c[1][1].x,a[1][1].y,b[1][1].y);
    V_MAC_F32(c[1][2].x,a[1][2].y,b[1][1].y);
    V_MAC_F32(c[1][3].x,a[1][3].y,b[1][1].y);
    V_MAC_F32(c[2][0].x,a[1][0].y,b[1][2].y);
    V_MAC_F32(c[2][1].x,a[1][1].y,b[1][2].y);
    V_MAC_F32(c[2][2].x,a[1][2].y,b[1][2].y);
    V_MAC_F32(c[2][3].x,a[1][3].y,b[1][2].y);
    V_MAC_F32(c[3][0].x,a[1][0].y,b[1][3].y);
    V_MAC_F32(c[3][1].x,a[1][1].y,b[1][3].y);
    V_MAC_F32(c[3][2].x,a[1][2].y,b[1][3].y);
    V_MAC_F32(c[3][3].x,a[1][3].y,b[1][3].y);
    V_MAC_F32(c[0][0].y,a[1][0].y,neg(b[1][0].x));
    V_MAC_F32(c[0][1].y,a[1][1].y,neg(b[1][0].x));
    V_MAC_F32(c[0][2].y,a[1][2].y,neg(b[1][0].x));
    V_MAC_F32(c[0][3].y,a[1][3].y,neg(b[1][0].x));
    V_MAC_F32(c[1][0].y,a[1][0].y,neg(b[1][1].x));
    V_MAC_F32(c[1][1].y,a[1][1].y,neg(b[1][1].x));
    V_MAC_F32(c[1][2].y,a[1][2].y,neg(b[1][1].x));
    V_MAC_F32(c[1][3].y,a[1][3].y,neg(b[1][1].x));
    V_MAC_F32(c[2][0].y,a[1][0].y,neg(b[1][2].x));
    V_MAC_F32(c[2][1].y,a[1][1].y,neg(b[1][2].x));
    V_MAC_F32(c[2][2].y,a[1][2].y,neg(b[1][2].x));
    V_MAC_F32(c[2][3].y,a[1][3].y,neg(b[1][2].x));
    V_MAC_F32(c[3][0].y,a[1][0].y,neg(b[1][3].x));
    V_MAC_F32(c[3][1].y,a[1][1].y,neg(b[1][3].x));
    V_MAC_F32(c[3][2].y,a[1][2].y,neg(b[1][3].x));
    V_MAC_F32(c[3][3].y,a[1][3].y,neg(b[1][3].x));
    s_setprio(0);

__lable__(2);
    s_lda_b32(alpha,argptr,0x3c);
    s_lda_b128(s0,argptr,0x0);
    v_cmp_u32(m,tidx,gt);
    s_mov_b64(s4,vcc);
    s_mov_b64(s6,exec);
    s_shl_b32(s9,col,3);
    s_sync(lgkmcnt(0));
    S_MUL_U64_U32(s14,ldc,s9);
    s_shl_b32(s9,ldc,3);
    s_shl_b32(s10,ldc,4);
    S_ADD_U64(cbase,cbase,s14);
    v_mul_lo_u32(v33,cbks,bank);
    v_add_shl_u32(v32,v33,tidx,3);
    v_mov_b32(v36,v32);

    for( int i=0, ilab=3; i<4; ++i )
    {
        const int s=i&1;
        if(i>0){
            if(s!=0){
            __lable__(ilab); ++ilab;
                s_mov_b64(exec,s6);
                s_add_u32(col,col,ic(1));
                v_add_u32(v32,s9,v32);
            } else {
                s_mov_b64(exec,s6);
                s_add_u32(col,col,ic(7));
                v_shl_add_u32(v32,s9,3,v36);
            }
        }
        lsst_b128(csst,0x0000,c[i][0].x);
        lsst_b128(csst,0x0080,c[i][2].x);
        v_add_u32(v33,s10,v32);
        v_add_u32(v34,s10,v33);
        v_add_u32(v35,s10,v34);
        s_mov_b64(exec,s4);
        s_sync(lgkmcnt(0));
        lsld_b64(v0,csld,0x000);
        lsld_b64(v2,csld,0x200);
        lsld_b64(v4,csld,0x400);
        lsld_b64(v6,csld,0x600);

        s_cmp_u32(col,n,lt);
        s_cbra_scc0(5);
        s_sync(lgkmcnt(3));
        v_mul_f32(v0,alpha,v0);
        v_mul_f32(v1,alpha,v1);
        stg_b64(cbase,v32,0,v0);
    
        s_add_u32(s2,ic(2),col);
        s_cmp_u32(s2,n,lt);
        s_cbra_scc0(s==0?ilab:5);
        s_sync(lgkmcnt(2));
        v_mul_f32(v2,alpha,v2);
        v_mul_f32(v3,alpha,v3);
        stg_b64(cbase,v33,0,v2);
    
        s_add_u32(s2,ic(4),col);
        s_cmp_u32(s2,n,lt);
        s_cbra_scc0(s==0?ilab:5);
        s_sync(lgkmcnt(1));
        v_mul_f32(v4,alpha,v4);
        v_mul_f32(v5,alpha,v5);
        stg_b64(cbase,v34,0,v4);
    
        s_add_u32(s2,ic(6),col);
        s_cmp_u32(s2,n,lt);
        s_cbra_scc0(s==0?ilab:5);
        s_sync(lgkmcnt(0));
        v_mul_f32(v6,alpha,v6);
        v_mul_f32(v7,alpha,v7);
        stg_b64(cbase,v35,0,v6);
    }
__lable__(5);
    s_endp();
}